package com.xjh.basestudy.designmode.createMode.createMode3_FactoryMethod.p3_factory;

/**
 * @author XuJianHua
 * @date 2022-09-22 16:09:06
 * @description
 * 我们在第9行的循环体中调用坦克工厂类生成敌人，结果制造出的产品肯定是5辆坦克，
 * * 接着又在第12行将工厂接口替换为飞机工厂类，结果5架飞机出现在屏幕上。
 * * 抵达关底后，在第18行我们又将工厂接口替换为关底Boss工厂类，结果关底Boss出现并与玩家进行战斗，具体结果如第22行开始的输出所示。
 * * 显而易见，多态化后的工厂多样性不言而喻，每个工厂的生产策略或方式都具备自己的产品特色，不同的产品需求都能找到相应的工厂来满足，
 * * 即便没有，我们也可以添加新工厂来解决，以确保游戏系统具有良好的兼容性和可扩展性。*
 * *
 * * 至此，以工厂方法模式构建的空战游戏就完成了，之后若要加入新的敌人类，只需添加相应的工厂类，无须再对现有代码做任何更改。
 * * 不同于简单工厂，工厂方法模式可以被看作由简单工厂演化而来的高级版，后者才是真正的设计模式。
 * * 在工厂方法模式中，不仅产品需要分类，工厂同样需要分类，与其把所有生产方式堆积在一个简单工厂类中，不如把生产方式放在具体的子类工厂中去实现，
 * * 这样做对工厂的抽象化与多态化有诸多好处，避免了由于新加入产品类而反复修改同一个工厂类所带来的困扰，使后期的代码维护以及扩展更加直观、方便。

 */
public class Client {

    public static void main(String[] args) {
        int screenWidth = 100;
        System.out.println("游戏开始");
        // 创建坦克工厂（为什么类型是Factory？同一个对象可以复制给多个工厂）
        Factory factory = new TankFactory();
        for (int i = 0; i < 5; i++) {
            factory.create(screenWidth).show();
        }

        factory = new AirplaneFactory();
        for (int i = 0; i < 5; i++) {
            factory.create(screenWidth).show();
        }

        System.out.println("抵达关底");
        factory = new BossFactory();
        factory.create(screenWidth).show();

          /*
              游戏开始
              坦克出现坐标：19,0
              坦克向玩家发起攻击……
              坦克出现坐标：7,0
              坦克向玩家发起攻击……
              坦克出现坐标：46,0
              坦克向玩家发起攻击……
              坦克出现坐标：64,0
              坦克向玩家发起攻击……
              坦克出现坐标：40,0
              坦克向玩家发起攻击……
              飞机出现坐标：62,0
              飞机向玩家发起攻击……
              飞机出现坐标：86,0
              飞机向玩家发起攻击……
              飞机出现坐标：32,0
              飞机向玩家发起攻击……
              飞机出现坐标：84,0
              飞机向玩家发起攻击……
              飞机出现坐标：33,0
              飞机向玩家发起攻击……
              抵达关底
              Boss出现坐标：50,0
              Boss向玩家发起攻击……
          */
    }

}